﻿// Copyright (c) 2012 Mokah Nnamezie & Andrew Cooper
// Neo4Net graph database - http://neo4net.codeplex.com
//
// This file is part of Neo4Net - a .Net port of the Neo4j graph database
//
// Neo4Net is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

namespace Neo4Net.Kernel.Impl.Core
{
    using System.Collections.Generic;
    using Neo4Net.Kernel.Impl.Nioneo.Store;
    using Neo4Net.Test.Impl;

    public partial class JumpingIdGeneratorFactory : IIdGeneratorFactory
    {
        private readonly IDictionary<IdType, IIdGenerator> generators = new Dictionary<IdType, IIdGenerator>();
        private readonly IIdGenerator forTheRest = new EphemeralIdGenerator(null);

        private readonly int sizePerJump;

        public JumpingIdGeneratorFactory(int sizePerJump)
        {
            this.sizePerJump = sizePerJump;
        }

        public IIdGenerator Open(IFileSystemAbstraction fs, string fileName, int grabSize,
                                    IdType idType, long highestIdInUse, bool startup)
        {
            return this[idType];
        }

        public IIdGenerator this[IdType idType]
        {
            get
            {
                if (idType == IdType.Node || idType == IdType.Relationship || idType == IdType.Property ||
                        idType == IdType.StringBlock || idType == IdType.ArrayBlock)
                {
                    IIdGenerator generator;
                    if (!generators.TryGetValue(idType, out generator))
                    {
                        generator = new JumpingIdGenerator(sizePerJump);
                        generators.Add(idType, generator);
                    }
                    return generator;
                }
                return forTheRest;
            }
        }

        public void Create(IFileSystemAbstraction fs, string fileName)
        {
        }
    }
}
